package com.example.springboot.service.impl;

import com.example.springboot.dao.impl.StudentDaoImpl;
import com.example.springboot.entity.Course;
import com.example.springboot.entity.Student;
import com.example.springboot.service.EntityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 *
 * 事务测试
 * propagation 属性，事务的传播行为，默认值为 Propagation.REQUIRED
 * Propagation.REQUIRED
 *
 * 如果当前存在事务，则加入该事务，如果当前不存在事务，则创建一个新的事务。
 *
 * Propagation.SUPPORTS
 *
 * 如果当前存在事务，则加入该事务；如果当前不存在事务，则以非事务的方式继续运行。
 *
 * Propagation.MANDATORY
 *
 * 如果当前存在事务，则加入该事务；如果当前不存在事务，则抛出异常。
 *
 * Propagation.REQUIRES_NEW
 *
 * 重新创建一个新的事务，如果当前存在事务，暂停当前的事务。
 *
 * Propagation.NOT_SUPPORTED
 *
 * 以非事务的方式运行，如果当前存在事务，暂停当前的事务。
 *
 * Propagation.NEVER
 *
 * 以非事务的方式运行，如果当前存在事务，则抛出异常。
 *
 * Propagation.NESTED
 *
 * 和 Propagation.REQUIRED 效果一样。
 * ***/
@Service
public class StudentServiceImpl implements EntityService<Student> {

	@Autowired
	private StudentDaoImpl studentDao;

	@Autowired
	private CourseServiceImpl courseService;

	
	@Override
	public Student getEntityById(Integer id) {
		// TODO Auto-generated method stub
		return studentDao.getEntityById(id);
	}

	@Override
	public List<Student> getEntityList() {
		// TODO Auto-generated method stub
		return studentDao.getEntityList();
	}

	@Transactional(propagation = Propagation.REQUIRED)//如果当前存在事务，则加入该事务，如果当前不存在事务，则创建一个新的事务
	@Override
	public int add(Student student) {
		// TODO Auto-generated method stub
		Course course = new Course();
		course.setCode(Long.toString(System.currentTimeMillis()/1000));
		course.setName("数学");
		course.setTeacher("张三疯");
		//添加课程
		courseService.add(course);
		//比如这里有很多业务处理
		//添加学生
		int addStudent = studentDao.add(student);

		boolean test = true;
		if (test){//当前方法出现异常，只回滚学生表，不影响课程表的数据插入
			throw new RuntimeException("add student 抛异常了，只回滚学生表，不影响课程表的数据插入");
		}

		return addStudent;
	}

	@Transactional(propagation = Propagation.REQUIRED)//如果当前存在事务，则加入该事务，如果当前不存在事务，则创建一个新的事务
	@Override
	public int update(Integer id, Student student) {
		// TODO Auto-generated method stub
		Course course = new Course();
		course.setCode(Long.toString(System.currentTimeMillis()/1000));
		course.setName("数学");
		course.setTeacher("张三疯");
		int courseId = 1;
		//更新课程
		courseService.update(courseId,course);
		//比如这里有很多业务处理
		//添加学生
		int updateStudent = studentDao.update(id, student);

		boolean test = true;
		if (test){//当前方法出现异常，回滚学生表和课程表的数据更新
			throw new RuntimeException("update student 抛异常了，回滚学生表和课程表的数据更新");
		}

		return updateStudent;
	}

	@Override
	public int delete(Integer id) {
		// TODO Auto-generated method stub
		return studentDao.delete(id);
	}

}
